package util

import (
	"encoding/binary"
	"fmt"
	"log"
	"net"
)

// WritePkgWithLength
//
//	@Description: 发送带长度的包，将长度和内容组装为一条数据进行发送 |0000|content|
//	@param conn
//	@param data[]byte
//	@return err
func WritePkgWithLength(conn net.Conn, text string) (err error) {
	//1.0内容转换成byte切片
	content := []byte(text)

	//1.1	计算消息的长度
	var dataLen = uint32(len(content))

	//1.2	创建一个足够大的byte切片来容纳uint32和内容
	buffer := make([]byte, 4+len(content))

	//1.3	将uint32写入到byte切片的前4个字节
	binary.BigEndian.PutUint32(buffer, dataLen)

	//1.4	将内容写入到byte切片的后面
	copy(buffer[4:], content)

	//1.5	发送
	n, _ := conn.Write(buffer)

	//1.6	打印发送的信息
	sprintf := fmt.Sprintf("Send--->>>content:%s length:%d total_length:%d", content, len(content), n)
	log.Println(sprintf)
	return nil
}

// ReadPkgWithLength 读取带长度的包，先读取长度，再读取内容  |0000|content|
//
//	@Description:
//	@param conn
//	@return text
//	@return err
func ReadPkgWithLength(conn net.Conn) (text string, err error) {
	//1.0	创建一个byte切片
	buf := make([]byte, 8096)

	//1.1	读取前4个字节
	n, err := conn.Read(buf[:4])
	if err != nil || n != 4 { //防止读取错误
		return "", err
	}

	//1.2	将前4个字节 转成一个 uint32类型，即为内容的长度
	var dataLen = binary.BigEndian.Uint32(buf[0:4])

	//1.3	从index=4 开始，读取dataLen长度的内容，即为内容
	_, err = conn.Read(buf[4 : dataLen+4])

	//1.4	将内容转换成string
	text = string(buf[4 : dataLen+4])

	//1.5	打印日志
	sprintf := fmt.Sprintf("Recive--->>>content:%s length:%d total_length:%d", text, len(text), dataLen+4)
	log.Println(sprintf)
	return text, nil
}
